#include <sys/ipc.h>
#include <stdio.h>
#include <sys/shm.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
char buf[2048]={0};
//读取点表
void OPenFile()
{
    FILE* fp;
    fp=fopen("dianbiao.json","r");
    if(NULL==fp)
    {
    perror("open err");
      return -1;
    }
    if(fread(buf,1,2048,fp)!=0)
    {
        printf("%s\n",buf);
    }
    else
    {
        perror("fread err\n");
    }

     fclose(fp);

    }

int main(int argc, char const *argv[])
{ 
      OpenFile();//读取点表
    
     pid_t pid;
    pid = fork();
    if (pid < 0)
    {
        perror("fork err");
        return -1;
    }
    else if (pid == 0)
    {
        
    }
    else
    {
        printf("parent\n");
    }
 







    while(1);  //让父子进程不要结束
    
    key_t key,key1;
   int shmid,shmid1;
    //创建key值
    key = ftok("datareport.c", 'a');
    if (key < 0)
    {
        perror("ftok err");
        return -1;
    }
    printf("key: %#x\n", key);
 
    //创建或打开共享内存
    shmid = shmget(key, 128, IPC_CREAT | IPC_EXCL | 0777); //没有则创建，有则返回-1
    if (shmid <= 0)
    {
        if (errno == EEXIST) //避免之前共享内存已经创建从而出现:File exists
        {
            shmid = shmget(key, 128, 0777); //直接打开共享内存
        }
        else
        {
            perror("shmget err");
            return -1;
        }
    }
    printf("shmid: %d\n", shmid);
    //映射共享内存到私有地址空间
    char *p = (char *)shmat(shmid, NULL, 0);
    if (p == (char *)-1)
    {
        perror("shmat err");
        return -1;
    }
    //操作共享内存
    scanf("%s", p);
    printf("%s\n", p);
 
    //取消映射
    shmdt(p);
 
    //删除共享内存
    shmctl(shmid, IPC_RMID, NULL);
 
     key1 = ftok("datareport.c", 'b');//修改访问文件的名字
    if (key1 < 0)
    {
        perror("ftok err");
        return -1;
    }
    printf("key1: %#x\n", key1);
 
    //创建或打开共享内存
    shmid1 = shmget(key1, 128, IPC_CREAT | IPC_EXCL | 0777); //没有则创建，有则返回-1
    if (shmid1 <= 0)
    {
        if (errno == EEXIST) //避免之前共享内存已经创建从而出现:File exists
        {
            shmid1 = shmget(key1, 128, 0777); //直接打开共享内存
        }
        else
        {
            perror("shmget err");
            return -1;
        }
    }
    printf("shmid1: %d\n", shmid);
    //映射共享内存到私有地址空间
    char *p1 = (char *)shmat(shmid1, NULL, 0);
    if (p1 == (char *)-1)
    {
        perror("shmat err");
        return -1;
    }
    //操作共享内存
    scanf("%s", p1);
    printf("%s\n", p1);
 
    //取消映射
    shmdt(p1);
 
    //删除共享内存
    shmctl(shmid1, IPC_RMID, NULL);



    return 0;
}
